package com.qfedu.lc.server.service.impl;

import cn.hutool.core.util.RandomUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;


import com.qfedu.lc.common.vo.R;
import com.qfedu.lc.common.param.UserVipAdd;
import com.qfedu.lc.server.entity.UserVip;
import com.qfedu.lc.server.entity.UserVipOrder;
import com.qfedu.lc.server.mapper.UserVipMapper;
import com.qfedu.lc.server.service.UserVipOrderService;
import com.qfedu.lc.server.service.UserVipService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qfedu.lc.server.service.UserWalletService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Calendar;
import java.util.Date;

/**
 * <p>
 * 8.用户收费会员表 服务实现类
 * </p>
 *
 * @author wgz
 * @since 2023-11-06
 */
@Service
public class UserVipServiceImpl extends ServiceImpl<UserVipMapper, UserVip> implements UserVipService {


    @Resource
    private UserVipMapper userVipMapper;

    @Resource // vip 订单
    private UserVipOrderService userVipOrderService;

    @Resource // 账户余额 钱包
    private UserWalletService userWalletService;

    /**
     *  // 创建订单
     *   // 1.UserVipOrderService.addOrder();
     *     扣减月
     *   // 2.UserWalletService.subUserWallet(user_id ,扣减的金额 );
     *
     *   // 修改订单状态
     *      3. UserVipOrderService.updateUserVipOrder(订单号，已支付状态)
     *
     *   //  创建、修改vip
     *     4. createOrUpdateVip();
     * @param vipAdd
     * @return
     */
    @Override
    public R buyVip(UserVipAdd vipAdd) {

        // 1.创建订单
        // vip 订单创建或者续费
        int type ;
        QueryWrapper<UserVip> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("user_id",vipAdd.getUserId());
        UserVip userVip = userVipMapper.selectOne(queryWrapper);
        if (userVip==null){
            type = 1; // 开通会员
        }else {
            type = 2; // 续费会员
        }
        // 订单号
        String no = System.currentTimeMillis()+RandomUtil.randomNumbers(6);

        userVipOrderService.addOrder(new UserVipOrder(vipAdd.getUserId(),type,vipAdd.getVipType(), vipAdd.getPayType(), vipAdd.getMoney(),no,1));


        // 2.UserWalletService.subUserWallet(user_id ,扣减的金额 );
        boolean subUserWalletResult = userWalletService.subUserWallet(vipAdd.getUserId(), vipAdd.getMoney() * 100);
        if (!subUserWalletResult){// 扣减与失败
            return R.fail("余额不足");
        }


        // 修改订单状态
//        3. UserVipOrderService.updateUserVipOrder(订单号，已支付状态)

        boolean updateVipOrderResult = userVipOrderService.updateUserVipOrder(no, 2);
        if (!updateVipOrderResult){
            return R.fail("订单异常");
        }


        //  创建、修改vip
//        4. createOrUpdateVip();
        boolean result = createOrUpdateVip(vipAdd.getUserId(), vipAdd.getVipType());

        if (!result){
            return R.fail("开通会员卡失败");
        }
        return R.ok("开通会员卡成功");


    }


    /**
     *
     *  // 1.根据user_id   查询是否 有vip    userVip
     *
     *     // 2.判断是否 存在userVip
     *     if(userVip == null ){
     *
     *     	直接插入vip  既可
     * user_id int comment '用户表id'：                 可以从 token 得到
     * type int comment '收费会员的类型 1.年卡 2.银卡 3.金卡'：   前端提交
     * sdate date comment '开始日期',                     ：new Date()
     * edate date comment '结束日期',                     :
     * 				Calendar                     alendar=Calendar.getInstance();
     * 				calendar.add(Calendar.DAY_OF_MONTH,365);
     * 				calendar.getTime()    一年后的时间
     *
     * days int comment '会员的总天数',    ：365
     * info varchar(50) comment '描述',   ：   购买年卡会员
     * ctime datetime comment '创建时间'：   new Date
     *     }else{
     *
     *           if（  userVip.getedate().getTime()< new Date().getTime() ）{   vip 是否过期
     *
     *                更新vip 数据行 ：   type,sdate,  edate（当前时间 +365）, days（365）,info
     *
     *           } else if（ userVip.getedate().getTime()>=  new Date().getTime() ） { //会员未过期
     *
     *           		更新vip 数据行 ：   type,sdate,  edat（edate+365), days（余额+365）,info
     *
     *           }
     *
     *
     *     }
     *
     * 创建 或者 续期vip
     * @param userId
     * @param type
     * @return
     */
    @Override
    public boolean createOrUpdateVip(Integer userId, int type) {
            // 1.根据user_id   查询是否 有vip    userVip

        QueryWrapper<UserVip> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("user_id",userId);
        UserVip userVip = userVipMapper.selectOne(queryWrapper);

        if (userVip==null){ // 当前用户没有vip 需要开卡

            Calendar calendar =Calendar.getInstance();
            calendar.add(Calendar.DAY_OF_MONTH,365);
            Date eDate = calendar.getTime()  ;
            userVip = new UserVip(userId,type,new Date(),eDate,365,"新开会员-会员类型"+type);

            int insertResult = userVipMapper.insert(userVip);
            if (insertResult>0){
                return true;
            }
        }else {  // 有会员情况
            if(userVip.getEdate().getTime()< new Date().getTime()) {  // vip 过期 重新开卡

                userVip.setSdate(new Date());

                Calendar calendar =Calendar.getInstance();
                calendar.add(Calendar.DAY_OF_MONTH,365);
                Date eDate = calendar.getTime()  ;
                userVip.setEdate(eDate);
                userVip.setDays(365);
                userVip.setType(type);
                userVip.setInfo("会员重新开卡-会员类型"+type);
            } else if (userVip.getEdate().getTime()>=  new Date().getTime()){ // 会员已经开卡需要续期

                Calendar calendar =Calendar.getInstance();
                calendar.setTime(userVip.getEdate());
                calendar.add(Calendar.DAY_OF_MONTH,365);
                Date eDate = calendar.getTime()  ;

                userVip.setEdate(eDate);
                userVip.setDays(userVip.getDays() +365);
                userVip.setInfo("会员开续费-会员类型"+type);
            }

            int updateResult = userVipMapper.updateById(userVip);

            if (updateResult>0){
                return true;
            }
        }


        return false;
    }
}
